package gestion.comunicacion;

import entidades.Jugador;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;

public class ServidorIndividual extends Thread {

    private Servidor padre;
    private Socket socketCliente;
    private PrintWriter salida;
    private BufferedReader entrada;
    private boolean corre = true;
    private int id;
    private Jugador ju = new Jugador();
    private String delimitador = "&-&-&";
    private boolean inicioPartida = false;

    public ServidorIndividual(Socket accept, Servidor padre, int id) {
        this.padre = padre;
        this.socketCliente = accept;
        this.id = id;
    }

    public void run() {
        try {
            salida = new PrintWriter(socketCliente.getOutputStream(), true);
            entrada = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));
            String lineaEntrada, lineaSalida;
            while (corre) {
                if ((lineaEntrada = entrada.readLine()) != null) {
                    if (lineaEntrada.compareTo("finMazoTarjeta") == 0) {
                        padre.finMazoTarjeta(id);
                    } else if (lineaEntrada.compareTo("solicitudTarjeta") == 0) {
                        padre.solicitarTarjeta(id);
                    } else if (lineaEntrada.compareTo("finPartida") == 0) {
                        padre.finalizarPartida(id);
                    } else if (lineaEntrada.compareTo("finTurno") == 0) {
                        padre.finalizarTurno();
                    } else if (lineaEntrada.compareTo("conocerColores") == 0) {
                        avisarColoresOcupados(padre.conocerColoresOcupados(id));
                    } else if (lineaEntrada.compareTo("conocerNombrePartida") == 0) {
                        avisarNombrePartida(padre.conocerNombrePartida(), padre.conocerTiempoTurno(), padre.conocerTipoMision());
                    } else if (lineaEntrada.compareTo("avisarInicioPartida") == 0) {
                        this.inicioPartida=true;
                        padre.iniciarPartida();
                    } else {
                        ArrayList<String> contenidoLineaEntrada = analizarCadena(lineaEntrada);
                        if (contenidoLineaEntrada.get(0).compareTo("color") == 0) {
                            String color = contenidoLineaEntrada.get(1);
                            String usuario = contenidoLineaEntrada.get(2);
                            ju.setColor(color);
                            ju.setNomUsuario(usuario);
                            ju.setID(this.id);
                            padre.avisarSeleccionColor(contenidoLineaEntrada, id);
                        } else if (contenidoLineaEntrada.get(0).compareTo("mensaje") == 0) {
                            padre.avisarNuevoMensaje(id, contenidoLineaEntrada.get(1));
                        } else if (contenidoLineaEntrada.get(0).compareTo("nuevaTropaPais") == 0) {
                            padre.avisarNuevaTropa(id, contenidoLineaEntrada.get(1));
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarAtaque") == 0) {
                            padre.avisarAtaque(lineaEntrada, id);
                        } else if (contenidoLineaEntrada.get(0).compareTo("avisarReagrupacion") == 0) {
                            padre.avisarReagrupacion(lineaEntrada, id);
                        } else if (contenidoLineaEntrada.get(0).compareTo("usoTarjeta") == 0) {
                            padre.avisarUsoTarjeta(contenidoLineaEntrada.get(1), id);
                        } else if (contenidoLineaEntrada.get(0).compareTo("canjeTarjeta") == 0) {
                            padre.avisarCanjeTarjeta(contenidoLineaEntrada, id);
                        }
                    }
                }
            }
        } catch (IOException ex) {
            try {
                System.out.println("3");
                salida.close();
                entrada.close();
                if (inicioPartida) {
                    padre.avisarAbandonoJugador(id);
                }else{
                    padre.desconectar(id);
                }
                socketCliente.close();
            } catch (IOException ex1) {
                System.out.println("4");
            }
        }
    }

    private ArrayList<String> analizarCadena(String test) {

        ArrayList<String> tokens = new ArrayList<String>();

        Scanner tokenize = new Scanner(test);
        tokenize.useDelimiter(delimitador);
        while (tokenize.hasNext()) {
            tokens.add(tokenize.next());
        }
        return tokens;
    }

    void avisarSeleccionColor(ArrayList<String> contenidoLineaEntrada) {
        salida.println("color" + delimitador + contenidoLineaEntrada.get(1) + delimitador + contenidoLineaEntrada.get(2));
    }

    public Jugador getJu() {
        return ju;
    }

    private void avisarColoresOcupados(ArrayList<Jugador> conocerColoresOcupados) {
        String coloresUsuarios = "avisarColores" + delimitador + conocerColoresOcupados.size();
        for (int i = 0; i < conocerColoresOcupados.size(); i++) {
            coloresUsuarios += delimitador + conocerColoresOcupados.get(i).getColor() + delimitador + conocerColoresOcupados.get(i).getNomUsuario();
        }
        salida.println(coloresUsuarios);
    }

    private void avisarNombrePartida(String nombrePartida, int tiempoTurno, int tipoMision) {
        salida.println("avisarNombrePartida" + delimitador + nombrePartida + delimitador + id + delimitador + tiempoTurno + delimitador + tipoMision);
    }

    public void iniciarPartida(String datosJugadoresPaisesYRondaYMision) {
        salida.println("iniciarPartida" + delimitador + datosJugadoresPaisesYRondaYMision);
    }

    public String recolectarDatosPropio() {
        return delimitador + this.id + delimitador + this.ju.getNomUsuario() + delimitador + this.ju.getColor();

    }

    public void mandarDatosInvidualJugadores(String datosJugadores) {
        salida.println(datosJugadores);
    }

    public void avisarNuevoMensaje(int id, String mensaje) {
        salida.println("mensaje" + delimitador + id + delimitador + mensaje);
    }

    public void avisarNuevaTropa(String idPais) {
        salida.println("nuevaTropaPais" + delimitador + idPais);
    }

    public void finTurno() {
        salida.println("finTurno");
    }

    public void finRonda() {
        salida.println("finRonda");
    }

    public void avisarAtaque(String lineaEntrada) {
        salida.println(lineaEntrada);
    }

    public void avisarReagrupacion(String lineaEntrada) {
        salida.println(lineaEntrada);
    }

    public void avisarFinPartida(int id) {
        salida.println("avisarFinPartida" + delimitador + id);
    }

    public void solicitarTarjeta() {
        salida.println("solicitarTarjeta");
    }

    public void avisarUsoTarjeta(String idPais) {
        salida.println("usoTarjeta" + delimitador + idPais);
    }

    public void avisarCanjeTarjeta(ArrayList<String> contenidoLineaEntrada) {
        salida.println("canjeTarjeta" + delimitador + contenidoLineaEntrada.get(1) + delimitador + contenidoLineaEntrada.get(2) + delimitador + contenidoLineaEntrada.get(3));
    }

    public void avisarFinMazoTarjeta() {
        salida.println("finMazoTarjeta");
    }

    public void avisarAbondonoJugador() {
        salida.println("abondonoJugador");
    }
}
